#include "crc.h"
#include "stdio.h"

/**
 * CRC-16-CCITT校验函数
 * @param data 待校验的数据
 * @param length 数据长度（字节）
 * @param init_crc 初始CRC值
 * @return 计算得到的CRC值
 */
uint16_t crc16_ccitt(const uint8_t *data, uint32_t length, uint16_t init_crc) 
{
    const uint16_t polynomial = 0x1021;
    uint16_t crc = init_crc;

    for (uint32_t i = 0; i < length; ++i) {
        crc ^= (uint16_t)data[i] << 8;

        for (uint8_t j = 0; j < 8; ++j) {
            if (crc & 0x8000) {
                crc = (crc << 1) ^ polynomial;
            } else {
                crc <<= 1;
            }
        }
    }

    return crc;
}

